﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Data;
using PersistenciaAccessLIB;
using System.Configuration;

namespace KimberlyDashboardLIB
{
    public class Usuario
    {
        //Constructor
        public Usuario()
        {
            this._roles = new List<Enumeraciones.Rol>();
        }

        #region "Atributos"
        private int _id;
        private string _login;
        private string _nombre;
        private string _apellido;
        private List<Enumeraciones.Rol> _roles;

        #endregion

        #region "Propiedades"
        public int Id
        {
            get { return _id; }
            set { _id = value; }
        }

        public string Login
        {
            get { return _login; }
            set { _login = value; }
        }

        public string Nombre
        {
            get { return _nombre; }
            set { _nombre = value; }
        }

        public string Apellido
        {
            get { return _apellido; }
            set { _apellido = value; }
        }

        public List<Enumeraciones.Rol> Roles
        {
            get { return _roles; }
            set { _roles = value; }
        }


        #endregion

        /// <summary>
        /// persiste los cambios del usuario actual en la base de datos
        /// </summary>
        /// <returns></returns>
        public void Actualizar()
        {
            string sql = "";
            Persistencia objPersistencia = new Persistencia(ConfigurationManager.ConnectionStrings["CONEXION"].ToString());

            //Si el id es igual a cero se crea el usuario
            if (this.Id == 0)
            {
                sql = "INSERT INTO Usuario (Usuario, Nombre, Apellido, Activo)" +
                    "VALUES ('" + this.Login + "', '" + this.Nombre + "', '" + this.Apellido + "', 1)";
                objPersistencia.ExecuteNonQuery(sql);

                //Obtiene el id del usuario recien creado
                DataSet dts = objPersistencia.ExecuteDataSet("SELECT MAX(Id) FROM Usuario WHERE Activo = 1");
                if (dts.Tables[0].Rows.Count > 0)
                    this.Id = Convert.ToInt32(dts.Tables[0].Rows[0][0].ToString());
                else
                    throw new Exception("No se encontró el id del usuario recién creado");
            }
            else
            {
                sql = "UPDATE Usuario SET Usuario = '" + this.Login + "', Nombre = '" + this.Nombre + "', " +
                    "Apellido = '" + this.Apellido + "' WHERE Id = " + this.Id.ToString();
                objPersistencia.ExecuteNonQuery(sql);
            }

            //Se actualiza el(los) rol(es)
            sql = "DELETE FROM USUARIO_ROL WHERE IdUsuario = " + this.Id.ToString();
            objPersistencia.ExecuteNonQuery(sql);

            for (int i = 0; i < this.Roles.Count; i++)
            {
                if (this.Roles[i].Equals(Enumeraciones.Rol.ADMINISTRADOR))
                    sql = "INSERT INTO USUARIO_ROL (IdUsuario, IdRol) VALUES (" + this.Id.ToString() + ", 1)";
                else if (this.Roles[i].Equals(Enumeraciones.Rol.CONSULTA))
                    sql = "INSERT INTO USUARIO_ROL (IdUsuario, IdRol) VALUES (" + this.Id.ToString() + ", 2)";
                objPersistencia.ExecuteNonQuery(sql);
            }            
        }

        /// <summary>
        /// Elimina un usuario (realmente lo inactiva en la base de datos)
        /// </summary>
        /// <param name="id"></param>
        public void Eliminar(int id)
        {            
            Persistencia objPersistencia = new Persistencia(ConfigurationManager.ConnectionStrings["CONEXION"].ToString());
            objPersistencia.ExecuteNonQuery("UPDATE Usuario SET Activo = 0 WHERE Id = " + id.ToString());            
        }

        /// <summary>
        /// retorna dataset con listado de ids de los roles a los que pertenece el usuario
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public DataSet GetRolesUsuario(int id)
        {
            Persistencia objPersistencia = new Persistencia(ConfigurationManager.ConnectionStrings["CONEXION"].ToString());
            return objPersistencia.ExecuteDataSet("SELECT IdRol FROM USUARIO_ROL WHERE IdUsuario = " + id.ToString() + " AND IdRol IN (SELECT Id FROM ROL WHERE ACTIVO = 1)");
        }


    }
}
